/**************************************************************************
 * Copyright?2004-2016 浙江盘石信息技术股份有限公司
 * All rights reserved.
 *
 * 项目名称：互金网络平台
 * 版权说明：本软件属浙江盘石信息技术股份有限公司所有，在未获浙江盘石信息技术股份有限公司正式授权情况下，
 *          任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。   
 ***************************************************************************/
package com.alnex.test04;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.*;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricTaskInstanceQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

/*
    UEL 统一表达式语言
 */
public class AssigneeUEL {

    // UEL 动态设置assignee
    @Test
    public void t1(){
        RuntimeService runtimeService = ProcessEngines.getDefaultProcessEngine().getRuntimeService();

        Map<String,Object> map = new HashMap<>();
        map.put("assignee0","zhangsan");
        map.put("assignee1","lishi");
        map.put("assignee2","wangwu");

        //4.启动流程实例，同时还要设置流程定义的assignee的值
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday", map);

        System.out.println(processInstance.getName());
    }

    //带参流程启动
    @Test
    public void t2(){
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RunService对象
        RuntimeService runtimeService = processEngine.getRuntimeService();

        Holiday holiday = new Holiday();
        holiday.setNum(2f);

        //参数设置
        Map<String,Object> variables = new HashMap<>();
        variables.put("num",holiday.getNum());

        //3.创建流程实例  流程定义的key需要知道 holiday
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1",variables);

        //4.输出实例的相关信息
        System.out.println("流程部署ID"+processInstance.getDeploymentId());//null
        System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());//holiday:1:4
        System.out.println("流程实例ID"+processInstance.getId());//2501
        System.out.println("活动ID"+processInstance.getActivityId());//null
    }

    //历史记录
    @Test
    public void t3(){
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到HistoryService
        HistoryService historyService = processEngine.getHistoryService();

        HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery();

        List<HistoricTaskInstance> list = historicTaskInstanceQuery.includeTaskLocalVariables().list();

        for (HistoricTaskInstance historicTaskInstance : list) {

            System.out.println(historicTaskInstance.getProcessInstanceId());
            System.out.println(historicTaskInstance.getName());
            System.out.println(historicTaskInstance.getAssignee());
            System.out.println(historicTaskInstance.getTaskLocalVariables());

            System.out.println("==================");
        }

    }

    //根据候选人 查询组任务
    @Test
    public void t4(){
        //流程key
        String processDefinitionKey = "holiday4";
        //任务候选人
        String candidateUser = "zhangsan";
        //创建taskService
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();

        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(processDefinitionKey)
                .taskCandidateUser(candidateUser)
                .list();
        for (Task task : list) {
            System.out.println(task.getId());//任务id
            System.out.println(task.getProcessInstanceId());//流程实例id
            System.out.println(task.getProcessDefinitionId());//审核id
            System.out.println(task.getAssignee());//负责人
            System.out.println(task.getName());//任务名称

        }
    }

    //用户拾取组任务
    @Test
    public void t5(){
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();

        //要拾取的任务id
        String testId = "6302";
        //任务候选人id
        String userId = "lishi";

        //拾取任务
        //即使该用户不是候选人也能拾取(建议拾取时校验是否有资格)

        //校验该用户有没有拾取任务的资格
        Task task = taskService.createTaskQuery().taskId(testId).taskCandidateUser(userId).singleResult();

        if (task != null){
            taskService.claim(testId,userId);
            System.out.println("拾取任务成功");
        }
    }
    //归还组任务
    @Test
    public void t6(){
        //代办任务
        String testId = "6302";
        //负责人
        String userId = "lishi";

        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();

        Task task = taskService.createTaskQuery().taskId(testId).taskAssignee(userId).singleResult();

        if (task != null){
            //如果设置为null，归还组任务,该任务没有负责人
            taskService.setAssignee(testId,null);
        }
    }

    //任务交接,任务负责人将任务交给其它候选人办理该任务
    @Test
    public void t7(){
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        String taskId = "6004";
        String userID = "zhnagsan1";

        // 校验userId是否是taskId的负责人，如果是负责人才可以归还组任务
        Task task = taskService.createTaskQuery().taskAssignee(userID).taskId(taskId).singleResult();

        if (task!= null){
            // 将此任务交给其它候选人办理该 任务
            String candidateUser = "zhangsan2";
            //根据候选人和组任务id查询，如果有记录说明该 候选人有资格拾取该 任务
            Task task1 = taskService.createTaskQuery().taskId(taskId).taskAssignee(candidateUser).singleResult();
            if (task1 != null){
                //可以交接
                taskService.setAssignee(taskId,candidateUser);
            }
        }
    }
}
